package model

import (
	"context"
	"os"

	"gitee.com/liumou_site/go-service"
)

// cleanupOldSSHConfig 清理其他可能存在的 SSH 服务单元文件或 init 启动脚本。
// 返回值:
//   - error: 如果清理过程中发生错误，返回错误信息；否则返回 nil。
func cleanupOldSSHConfig(oldConfigPaths []string) error {
	// 遍历并删除旧配置文件
	for _, path := range oldConfigPaths {
		if _, err := os.Stat(path); err == nil {
			// 文件存在，尝试删除
			if err = os.Remove(path); err != nil {
				GetLanguageManager().Error("无法删除旧配置文件: ", "Unable to delete old configuration file: ", err)
				return err
			}
			GetLanguageManager().Info("旧配置文件已清理", "The old configuration file has been cleaned up")
		}
	}
	return nil
}

// stopAndCleanupOldServices 使用 go-service 库检测并清理相关服务
// 该函数会检测 ssh-guardian、cls.service、xc-ssh 等服务的状态
// 只要服务存在，就需要停止、禁用、重置并移除服务文件
//
// 参数:
//   - i: Info 结构体指针，包含调试信息等
//
// 返回值:
//   - error: 如果过程中发生错误，则返回错误信息；否则返回 nil
func stopAndCleanupOldServices(i *Info) error {
	if i.Debug {
		GetLanguageManager().Debug("正在停止并清理旧服务", "stopAndCleanupOldServices")
	}

	// 定义需要检测和清理的服务列表
	servicesToCheck := []string{
		"ssh-guardian",
		"cls",
		"xc-ssh",
		"com.liumou.ssh",
	}

	ctx := context.Background()

	// 遍历服务列表，检测并清理所有存在的服务
	for _, serviceName := range servicesToCheck {
		// 使用 go-service 库创建服务实例
		service, err := go_service.NewService(serviceName, "", "")
		if err != nil {
			if i.Debug {
				GetLanguageManager().Debug("为服务"+serviceName+"创建服务实例失败: ", "Failed to create service instance for "+serviceName+": ", err)
			}
			continue
		}

		// 检查服务是否存在
		if !service.IsServiceExist() {
			if i.Debug {
				GetLanguageManager().Debug("未找到服务"+serviceName, "Service "+serviceName+" not found")
			}
			continue
		}

		// 服务存在，记录信息
		GetLanguageManager().Info("服务 "+serviceName+" 存在，正在清理...", "Service "+serviceName+" exists, proceeding with cleanup...")

		// 检查服务是否正在运行
		status, err := service.GetServiceStatus(ctx)
		if err == nil && status != nil && status.Running {
			// 服务正在运行，先停止服务
			GetLanguageManager().Info("服务 "+serviceName+" 正在运行，正在停止...", "Service "+serviceName+" is running, stopping it...")
			err = service.Stop(ctx)
			if err != nil {
				GetLanguageManager().Warn("停止服务"+serviceName+"失败: ", "Failed to stop service "+serviceName+": ", err)
			} else {
				GetLanguageManager().Info("成功停止服务 "+serviceName, "Successfully stopped service "+serviceName)
			}
		} else {
			if i.Debug {
				GetLanguageManager().Debug("服务"+serviceName+"未运行", "Service"+serviceName+"is not active")
			}
		}

		// 禁用服务（无论是否运行都需要禁用）
		err = service.Disable(ctx)
		if err != nil {
			GetLanguageManager().Warn("禁用服务"+serviceName+"失败: ", "Failed to disable service "+serviceName+": ", err)
		} else {
			GetLanguageManager().Info("成功禁用服务 "+serviceName, "Successfully disabled service "+serviceName)
		}

		// 移除服务文件（无论是否运行都需要移除）
		err = service.RemoveService(ctx)
		if err != nil {
			GetLanguageManager().Warn("移除服务"+serviceName+"失败: ", "Failed to remove service "+serviceName+": ", err)
		} else {
			GetLanguageManager().Info("成功移除服务 "+serviceName, "Successfully removed service "+serviceName)
		}
	}

	return nil
}
